]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
networkAgent: Invalidate VPN plugin cache on changes
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 3 Nov 2016 12:32:40 +0000 (13:32 +0100)
committerFlorian Müllner <fmuellner@gnome.org>
Thu, 10 Nov 2016 13:32:07 +0000 (14:32 +0100)
Currently the cache is built once when the first VPN request is
handled, so plugins that are installed or uninstalled after that
aren't picked up. Fix this by invalidating the cache on changes
to the plugin directory.

https://bugzilla.gnome.org/show_bug.cgi?id=773893

js/ui/components/networkAgent.js

index 9308ac04f2eab5fdcd756a89610b0420218c2b68..205d2f72c0cab8f9bf9343bc79665b5f9c5fcab2 100644 (file)
@@ -615,6 +615,14 @@ const NetworkAgent = new Lang.Class({
         this._vpnRequests = { };
         this._notifications = { };
 
+        this._pluginDir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
+        try {
+            let monitor = this._pluginDir.monitor(Gio.FileMonitorFlags.NONE, null);
+            monitor.connect('changed', () => { this._vpnCacheBuilt = false; });
+        } catch(e) {
+            log('Failed to create monitor for VPN plugin dir: ' + e.message);
+        }
+
         this._native.connect('new-request', Lang.bind(this, this._newRequest));
         this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
 
@@ -765,9 +773,8 @@ const NetworkAgent = new Lang.Class({
         this._vpnCacheBuilt = true;
         this._vpnBinaries = { };
 
-        let dir = Gio.file_new_for_path(GLib.build_filenamev([Config.SYSCONFDIR, 'NetworkManager/VPN']));
         try {
-            let fileEnum = dir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
+            let fileEnum = this._pluginDir.enumerate_children('standard::name', Gio.FileQueryInfoFlags.NONE, null);
             let info;
 
             while ((info = fileEnum.next_file(null))) {
@@ -777,7 +784,7 @@ const NetworkAgent = new Lang.Class({
 
                 try {
                     let keyfile = new GLib.KeyFile();
-                    keyfile.load_from_file(dir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
+                    keyfile.load_from_file(this._pluginDir.get_child(name).get_path(), GLib.KeyFileFlags.NONE);
                     let service = keyfile.get_string('VPN Connection', 'service');
                     let binary = keyfile.get_string('GNOME', 'auth-dialog');
                     let externalUIMode = false;
@@ -810,7 +817,7 @@ const NetworkAgent = new Lang.Class({
                     }
                 } catch(e) {
                     log('Error \'%s\' while processing VPN keyfile \'%s\''.
-                        format(e.message, dir.get_child(name).get_path()));
+                        format(e.message, this._pluginDir.get_child(name).get_path()));
                     continue;
                 }
             }